<?php

namespace app\data\service;

use think\admin\extend\HttpExtend;
use think\admin\Service;

/**
 * 字符串解析
 * Class NewsService
 * @package app\data\service
 */
class StringParse extends Service
{
    /**
     * 手动录入
     * @param $inputStr
     * @return array
     */
    public function manualEntry($inputStr)
    {
        // 查无数据就补充，查到了就更新
        /*
        司机车牌：苏NGH230
        司机姓名：潘其建
        手机号码：18751096688
        车长车身颜色：16
        预约城市：东莞
        车身是否有广告： 无
        城市负责人：XX；
        喷漆完成：是/否；
        喷漆师傅：XX；
        尾部喷漆：是/否；
        广告覆盖是否收费：是/否；
        覆盖几面：0；
        覆盖收费：0；
        */

        $inputStr = str_replace(' ', '', $inputStr);

        $pattern = '/(?:司机姓名|司机名字)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)/u';
        $pattern = '/(?:司机姓名|司机名字)[∶:： ]?\s*(.*?)(?=\s*(?:司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|[[:punct:]]|\n|$))/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['username'] = trim($matches[1] ?? '');
        $infoArr['username'] = trim($matches[1] ?? '');

        $pattern = '/(?:司机车牌|车牌|车辆牌照)[∶∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)(?<![\p{P}\p{S}])/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['plate_number'] = mb_substr(trim(preg_replace('/\s+/', '', $matches[1] ?? '')), 0, 8, 'UTF-8');

        $pattern = '/(?:电话号码|手机号码)[∶:： ]?\s*(\d+)/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['phone'] = $matches[1] ?? '';

        $pattern = '/(?:车长车身颜色|车长车型颜色|车型)[∶:： ]?\s*([\d.]*[\p{L}\p{Zs}]*)(?=\s*(?:司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$|\z))(?<!预约喷漆时间)/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['car_vehicle_type'] = $matches[1] ?? '';
        if (!empty($infoArr['car_vehicle_type'])) {
            [$digits, $chinese] = $this->splitDigitsAndChinese($infoArr['car_vehicle_type']);
            $infoArr['car_color'] = $this->carColorParse($infoArr['car_vehicle_type']);
            $infoArr['car_vehicle_type_id'] = $this->carVehicleType($digits, $chinese);
        }

        $pattern = '/(?:预约城市|目的地|预计地点)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)/u';
        $pattern = '/(?:预约城市|目的地|预计地点)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['city'] = $matches[1] ?? '';
        $address = $matches[1] ?? '';

        $pattern = '/(?:预约区县)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['area'] = $matches[1] ?? '';
        $address .= $matches[1] ?? '';

        $pattern = '/^([\x{4e00}-\x{9fa5}]+省)?([\x{4e00}-\x{9fa5}]+市)?([\x{4e00}-\x{9fa5}]+区)?$/u';
        // 执行正则表达式匹配
        preg_match($pattern, $address, $matches);
        $infoArr['province'] = $address;

//        $pattern = '/^(?:预计)?时间[∶:： ]?\s*\s*([\p{L}\p{Han}\d\s,:\-\/]+)(?=\n|$)/um';
//        $pattern = '/(?:预约喷漆时间|时间)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|\n|$)/s';
//        preg_match($pattern, $inputStr, $matches);
//        $infoArr['time_plan'] = $matches[1] ?? '';
//        $infoArr['time_plan'] = $this->timeParse($infoArr['time_plan']);

        $pattern = '/(?:车身是否有广告|广告)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)(?<![\p{P}\p{S}])/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['car_has_ad'] = $this->boolParse($matches[1] ?? '');

//        $pattern = '/(?:是否知道签署协议|是否知道1年协议)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)/u';
//        preg_match($pattern, $inputStr, $matches);
//        $infoArr['is_aware_of_2_year_agreement'] = $this->boolParse($matches[1] ?? '');

//        $pattern = '/(?:司机车牌是否与平台一致|车牌是否一致)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)/u';
//        preg_match($pattern, $inputStr, $matches);
//        $infoArr['is_plate_number_consistent'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:喷漆完成)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['paint_status'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:喷漆师傅)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['painter'] = $matches[1] ?? '';

        $pattern = '/(?:尾部喷漆)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['end_paint_status'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:广告覆盖是否收费)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['ad_cover_fee'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:覆盖几面)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['cover_num'] = $matches[1] ?? '';

        $pattern = '/(?:城市负责人)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        if (!empty($matches[1] ?? '')) {
            $infoArr['has_uuid_city'] = true;
            $infoArr['uuid_docking'] = sysdata('DefaultDockingUuid');
            $infoArr['uuid_city'] = $this->app->db->name('work_user')->where('name', trim($matches[1]))->value('id') ?: sysdata('DefaultCityUuid');
            $now = date('Y-m-d H:i:s');
            $infoArr['time_docking'] = $now;
            $infoArr['time_complete'] = $now;
        }

//        $pattern = '/(?:是否空跑)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
//        preg_match($pattern, $inputStr, $matches);
//        $infoArr['fail_status'] = $this->boolParse($matches[1] ?? '');

//        $pattern = '/(?:是否作业)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
//        preg_match($pattern, $inputStr, $matches);
//        $infoArr['is_deal'] = $this->boolParse($matches[1] ?? '');

//        $pattern = '/(?:是否有覆盖)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$)/su';
//        preg_match($pattern, $inputStr, $matches);
//        $infoArr['has_cover'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:车长车身颜色|车长车型颜色|车型)[∶:： ]?\s*([\d.]*[\p{L}\p{Zs}]*)(?=\s*(?:司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|城市负责人|[[:punct:]]|\n|$|\z))(?<!预约喷漆时间)/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['car_vehicle_type'] = $matches[1] ?? '';
        if (!empty($infoArr['car_vehicle_type'])) {
            [$digits, $chinese] = $this->splitDigitsAndChinese($infoArr['car_vehicle_type']);
            $infoArr['car_color'] = $this->carColorParse($infoArr['car_vehicle_type']);
            $infoArr['car_vehicle_type_id'] = $this->carVehicleType($digits, $chinese);
        }

        $pattern = '/(?:覆盖收费)[:：]?\s*([0-9.]+).*$/um';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['cover_price'] = $matches[1] ?? '';

        foreach ($infoArr as $key => $item) {
            $infoArr[$key] = trim($item);
        }

        return $infoArr;
    }

    /**
     * 识别喷漆完成情况
     * @param $inputStr
     * @return array
     */
    public function completeInfo($inputStr): array
    {
        $pattern = "/^([\x{4e00}-\x{9fa5}][A-Za-z]{1}[A-Za-z0-9]{4,5}[A-Za-z0-9挂学警港澳]{1})[∶:：;； ]?(.*)$/us";
        $inputStr = preg_replace('/\s+/', '', $inputStr);
        preg_match($pattern, $inputStr, $matches);
        $infoArr['plate_number'] = mb_substr(trim(preg_replace('/\s+/', '', $matches[1] ?? '')), 0, 8, 'UTF-8');

        $pattern = '/(?:喷漆完成)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['paint_status'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:喷漆师傅)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['painter'] = $matches[1] ?? '';

        $pattern = '/(?:尾部喷漆)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['end_paint_status'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:广告覆盖是否收费)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['ad_cover_fee'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:覆盖几面)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['cover_num'] = $matches[1] ?? '';

        $pattern = '/(?:是否空跑)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['fail_status'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:是否作业)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['is_deal'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:是否有覆盖)[∶:： ]?\s*(.*?)(喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['has_cover'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:车长车身颜色|车长车型颜色|车型)[∶:： ]?\s*([\d.]*[\p{L}\p{Zs}]*)(?=\s*(?:喷漆完成|喷漆师傅|尾部喷漆|广告覆盖是否收费|覆盖几面|覆盖收费|是否空跑|是否作业|是否有覆盖|车型|[[:punct:]]|\n|$|\z))(?<!预约喷漆时间)/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['car_vehicle_type'] = $matches[1] ?? '';
        if (!empty($infoArr['car_vehicle_type'])) {
            [$digits, $chinese] = $this->splitDigitsAndChinese($infoArr['car_vehicle_type']);
            $infoArr['car_color'] = $this->carColorParse($infoArr['car_vehicle_type']);
            $infoArr['car_vehicle_type_id'] = $this->carVehicleType($digits, $chinese);
        }

        $pattern = '/(?:覆盖收费)[:：]?\s*([0-9.]+).*$/um';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['cover_price'] = $matches[1] ?? '';


        return $infoArr;
    }

    /**
     * 邀请信息匹配
     * @param $inputStr
     * @return array
     */
    public function inviteInfo($inputStr): array
    {
//        $pattern = "/^([\x{4e00}-\x{9fa5}][A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})[;； ]?(.*)$/u";
        $pattern = "/^([\x{4e00}-\x{9fa5}][A-Za-z]{1}[A-Za-z0-9]{4,5}[A-Za-z0-9挂学警港澳]{1})[∶:：;； ]?(.*)$/us";
        $inputStr = preg_replace('/\s+/', '', $inputStr);
        preg_match($pattern, $inputStr, $matches);

        if (isset($matches[1]) && isset($matches[2])) {
            $matches[1] = strtoupper($matches[1]);
            $record = $this->app->db->name('data_record')->where('plate_number', $matches[1])->whereIn('paint_status', [-1, 0])->findOrEmpty();
        }

        return [$record ?? [], $matches[2] ?? ''];
    }


    /**
     * 邀请信息匹配
     * @param $inputStr
     * @return array
     */
    public function inviteInfoById($inputStr): array
    {
        $prefix = substr($inputStr, 0, 2);
        if (!strcasecmp($prefix, 'id') === 0) {
            return [0, ''];
        }

        $pattern = '/^((1000|[1-9]\d{3,}))(?:[；;,， ]*)(.*?)$/u';
        preg_match($pattern, $inputStr, $matches);
        $number = $matches[1] ?? 0; // 匹配到的数字
        $text = trim($matches[3] ?? ''); // 匹配到的文本，并去除首尾空格
        return [$number, $text];
    }

    /**
     * 车辆信息采集
     * @param $inputStr
     * @return array
     */
    public function carParse($inputStr): array
    {
        $inputStr = str_replace(' ', '', $inputStr);

        $pattern = '/(?:司机姓名|司机名字)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)/u';
        $pattern = '/(?:司机姓名|司机名字)[∶:： ]?\s*(.*?)(?=\s*(?:司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|[[:punct:]]|\n|$))/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['username'] = trim($matches[1] ?? '');
        $infoArr['username'] = trim($matches[1] ?? '');

        $pattern = '/(?:司机车牌|车牌|车辆牌照)[∶∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)(?<![\p{P}\p{S}])/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['plate_number'] = mb_substr(trim(preg_replace('/\s+/', '', $matches[1] ?? '')), 0, 8, 'UTF-8');

        $pattern = '/(?:电话号码|手机号码)[∶:： ]?\s*(\d+)(?!\d)/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['phone'] = $matches[1] ?? '';

        $pattern = '/(?:车长车身颜色|车长车型颜色|车型)[∶:： ]?\s*([\d.]*[\p{L}\p{Zs}]*)(?=\s*(?:司机姓名|司机名字|预约城市|预约区县|预计地点|目的地|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|车身是否有广告|广告|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|[[:punct:]]|\n|$|\z))(?<!预约喷漆时间)/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['car_vehicle_type'] = $matches[1] ?? '';
        if (!empty($infoArr['car_vehicle_type'])) {
            [$digits, $chinese] = $this->splitDigitsAndChinese($infoArr['car_vehicle_type']);
            $infoArr['car_color'] = $this->carColorParse($infoArr['car_vehicle_type']);
            $infoArr['car_vehicle_type_id'] = $this->carVehicleType($digits, $chinese);
        }

        $pattern = '/(?:预约城市|目的地|预计地点)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)/u';
        $pattern = '/(?:预约城市|目的地|预计地点)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|\n|[[:punct:]]|$)/su';
        preg_match($pattern, $inputStr, $matches);

        $address = $matches[1] ?? '';

        $pattern = '/(?:预约区县)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|预约喷漆时间|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|\n|[[:punct:]]|$)/su';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['city'] = $matches[1] ?? '';
        $address .= $matches[1] ?? '';

        $pattern = '/^([\x{4e00}-\x{9fa5}]+省)?([\x{4e00}-\x{9fa5}]+市)?([\x{4e00}-\x{9fa5}]+区)?$/u';
        // 执行正则表达式匹配
        preg_match($pattern, $address, $matches);
        $infoArr['area'] = $matches[1] ?? '';
        $infoArr['province'] = $address;

        $pattern = '/^(?:预计)?时间[∶:： ]?\s*\s*([\p{L}\p{Han}\d\s,:\-\/]+)(?=\n|$)/um';
        $pattern = '/(?:预约喷漆时间|时间)[∶:： ]?\s*(.*?)(司机姓名|司机名字|司机车牌|电话号码|手机号码|车长车身颜色|车长车型颜色|车型|预约城市|预约区县|预计地点|目的地|车身是否有广告|广告|是否知道签署协议|是否知道1年协议|司机车牌是否与平台一致|车牌是否一致|\n|[[:punct:]]|$)/s';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['time_plan'] = $matches[1] ?? '';
        $infoArr['time_plan'] = $this->timeParse($infoArr['time_plan']);

        $pattern = '/(?:车身是否有广告|广告)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)(?<![\p{P}\p{S}])/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['car_has_ad'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:是否知道签署协议|是否知道1年协议)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)(?<![\p{P}\p{S}])/u';
        preg_match($pattern, $inputStr, $matches);

        $infoArr['is_aware_of_2_year_agreement'] = $this->boolParse($matches[1] ?? '');

        $pattern = '/(?:司机车牌是否与平台一致|车牌是否一致)[∶:： ]?\s*([\p{L}\p{N}\p{P}\p{S}\p{Z}]+)(?<![\p{P}\p{S}])/u';
        preg_match($pattern, $inputStr, $matches);
        $infoArr['is_plate_number_consistent'] = $this->boolParse($matches[1] ?? '');

        foreach ($infoArr as $key => $item) {
            $infoArr[$key] = trim($item);
        }

        return $infoArr;
    }

    /**
     * 日期解析
     * @param $time
     * @return false|string
     */
    public function timeParse($text)
    {
        if (empty($text)) {
            return date('Y-m-d');
        }
        $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $text);
        if ($dt !== false && !array_sum($dt->getLastErrors())) {
            return $text;
        }

        $formats = array(
            'n.j', // 7.8
            'n-j', // 7-8
            'm-d', // 07-08
            'n月j号', // 7月8号
            'n月j', // 7月8
        );

        foreach ($formats as $format) {

            $pattern = '/[\x{4e00}-\x{9fa5}]/u'; // 匹配中文的Unicode编码范围
            $replacement = '';
            $formatText = preg_replace($pattern, $replacement, $text);
            $time = date_create_from_format($format, $formatText);
            if ($time) {
                return $time->format('Y-m-d');
            }
        }
        if (strpos('今天', $text) !== false || strpos('现在', $text) !== false || strpos('马上', $text) !== false || strpos('立刻', $text) !== false) {
            return date('Y-m-d');
        } else if (strpos('明天', $text) !== false) {
            return date('Y-m-d', strtotime("+1 day"));
        } else if (strpos('大后天', $text) !== false) {
            return date('Y-m-d', strtotime("+3 day"));
        } else if (strpos('后天', $text) !== false) {
            return date('Y-m-d', strtotime("+2 day"));
        } else {
            return date('Y-m-d');
        }
    }

    /**
     * 布尔值解析
     * @param $text
     * @return int
     */
    public function boolParse($text): int
    {
        if (in_array($text, ['是', '有', '是的', '有的', '知道'])) {
            return 1;
        } else if (in_array($text, ['无', '否', '没有', '不知道'])) {
            return 0;
        }

        return -1;
    }

    /**
     * 有无解析
     * @param $text
     * @return int
     */
    public function youWu2Text($text): string
    {
        if ($text == 1) {
            return '有';
        } else if ($text == 0) {
            return '无';
        } else {
            return '';
        }
    }

    /**
     * 有无解析
     * @param $text
     * @return int
     */
    public function shiFou2Text($text): string
    {
        if ($text == 1) {
            return '是';
        } else if ($text == 0) {
            return '否';
        } else {
            return '';
        }
    }

    /**
     * 匹配汽车颜色
     * @param $text
     * @return string
     */
    public function carColorParse($text)
    {
        $hasRed = strpos($text, '红') !== false;
        $hasWhite = strpos($text, '白') !== false;

        if ($hasRed) {
            return '红';
        }

        if ($hasWhite) {
            return '白';
        }

        return '';
    }

    /**
     * 匹配数字和汉字
     * @param $text
     * @return array
     */
    public function splitDigitsAndChinese($text)
    {
        $pattern = '/^(\d*(?:\.\d*)?)(.*)$/';
        preg_match($pattern, $text, $matches);
        return [$matches[1], $matches[2]];
    }

    /**
     * 匹配车型
     * @param $text
     * @return mixed|void
     */
    public function carVehicleType($digits, $chinese)
    {
        $vehicleType = $this->app->db->name('car_vehicle_types')
            ->where('match_text', 'like', "%,{$digits},%")
            ->whereOr('match_text', 'like', "%,{$chinese},%")
            ->findOrEmpty();

        if ($vehicleType) {
            return $vehicleType['id'];
        }

        return 0;
    }

    /**
     * 腾讯地图解析
     * @param $address
     * @return string[]
     */
    public function tencentParse($address)
    {
        // 腾讯地图 API 密钥
        $api_key = 'RD5BZ-TX7LJ-4XAFK-FNVVW-34KKZ-L5BFO'; // 无二小程序
//        $api_key = 'BOCBZ-42OKJ-J5UFE-FM6UU-233GO-6XF5F';

        // 构造 API 请求 URL
        $address = trim($address);
        $url = "https://apis.map.qq.com/ws/geocoder/v1/";
        // 发送 HTTP 请求并获取响应
        $response = HttpExtend::get($url, [
            'address' => $address,
            'key' => $api_key,
        ]);

        // 解析响应 JSON 数据
        $json = json_decode($response, true);

        // 获取省、市、区信息
        return [
            'province' => $json['result']['address_components']['province'] ?? '',
            'city' => $json['result']['address_components']['city'] ?? '',
            'area' => $json['result']['address_components']['district'] ?? '',
        ];
    }
}